package initialize

import (
	"awesomeProject/order-web/global"
	"encoding/json"
	"fmt"
	"github.com/nacos-group/nacos-sdk-go/clients"
	"github.com/nacos-group/nacos-sdk-go/common/constant"
	"github.com/nacos-group/nacos-sdk-go/vo"
	"github.com/spf13/viper"
	"go.uber.org/zap"
)

// GetEnvInfo 读取环境变量
func GetEnvInfo(env string) bool {
	viper.AutomaticEnv()
	return viper.GetBool(env)
}

// InitConfig 初始化配置信息
func InitConfig() {

	// 区分生产环境和测试环境的配置文件
	debug := GetEnvInfo("SALE_SYSTEM") // 需要在系统中设置，然后进行判断
	configFilePrefix := "config"

	// // 不能够使用绝对路径！！！我也不知道为什么
	//configFileName := fmt.Sprintf("user-web/%s-pro.yaml", configFilePrefix)
	//if debug {
	//	configFileName = fmt.Sprintf("user-web/%s-debug.yaml", configFilePrefix)
	//}
	configFileName := fmt.Sprintf("C:/Users/86178/GolandProjects/sale_system_api/order-web/%s-pro.yaml", configFilePrefix)
	if debug {
		configFileName = fmt.Sprintf("C:/Users/86178/GolandProjects/sale_system_api/order-web/%s-debug.yaml", configFilePrefix)
	}

	// 设置读取对象
	v := viper.New()
	v.SetConfigFile(configFileName)

	// 开始读取NacosConfig的配置信息
	err := v.ReadInConfig()
	if err != nil {
		zap.S().Errorf("Viper读取配置文件失败 error: %v", err.Error())
	}

	err = v.Unmarshal(global.NacosConfig)
	if err != nil {
		zap.S().Errorf("Viper Unmarshal error: %v", err.Error())
	}

	zap.S().Info("Nacos配置信息: %v", global.NacosConfig)

	// 开始从Nacos中读取配置文件信息
	SrvConfig := []constant.ServerConfig{
		{
			IpAddr: global.NacosConfig.Host,
			Port:   global.NacosConfig.Port,
		},
	}

	CliConfig := constant.ClientConfig{
		NamespaceId:         global.NacosConfig.NameSpace,
		TimeoutMs:           5000,
		NotLoadCacheAtStart: true,
		LogDir:              "./tmp/nacos/log",
		CacheDir:            "./tmp/nacos/cache",
		LogLevel:            "INFO",
	}
	configClient, err := clients.CreateConfigClient(map[string]interface{}{

		"serverConfigs": SrvConfig,
		"clientConfig":  CliConfig,
	})

	if err != nil {
		zap.S().Fatalf("创建Nacos失败: %v", err.Error())
	}

	// 从配置文件客户端对象进行读取，获取对应模块的config配置信息
	config, err := configClient.GetConfig(vo.ConfigParam{
		DataId: global.NacosConfig.DataId,
		Group:  global.NacosConfig.Group,
	})

	//zap.S().Info(config)	// 查看配置文件

	if err != nil {
		zap.S().Fatalf("读取nacos配置失败: %v", err.Error())
	}

	err = json.Unmarshal([]byte(config), &global.ServerConfig)
	zap.S().Info("Server配置信息: %v", global.ServerConfig)

	if err != nil {
		zap.S().Fatalf("序列化nacos配置失败: %v", err.Error())
	}
}
